package com.changjiang.myproductsale.myproduct.dao;

import java.io.InputStream;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

/**
 * 封装了jdbc的常用操作  继承它使用
 */
public abstract class BaseDao {
    //准备配置文件 properties
    private static Properties properties = null;
    //配置文件的地址
    private static final String DataBaseConfig =
            "dbconfig/databaseconfig.properties";

    protected  Connection connection=null;
    protected  Statement statement=null;
    protected  PreparedStatement pst=null;
    protected  ResultSet  resultSet = null;

    static {
        //加载配置文件
        properties = new Properties();
        InputStream inSTream = Thread.currentThread()
                .getContextClassLoader().getResourceAsStream(DataBaseConfig);
        try {
            properties.load(inSTream);
            Class.forName(properties.getProperty("jdbc.driver"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 连接数据库
     * @return 连接对象
     */
    public Connection initConnection() {
        String url = properties.getProperty("jdbc.url");
        String user = properties.getProperty("jdbc.user");
        String password = properties.getProperty("jdbc.password");
        System.out.println(user);
        System.out.println(password);
        try {
            connection = DriverManager.getConnection(url, user, password);

            return connection;
        } catch (Exception  e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 创建 statement对象
     */
    public  void initStatement(){
        connection = initConnection();
        try{
            statement = connection.createStatement();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 关闭相关对象的
     */
    public void close() {
        try {
            if (resultSet != null) {
                resultSet.close();
            }
            if (pst != null) {
                pst.close();
            }
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 执行增删改语句 并且没有? 不需要拼接的
     * @param sql
     * @return 受影响的行数 几行 的几
     */
    public int executeUpdate(String sql) {
        initStatement();
        try {
            return statement.executeUpdate(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        finally {
            close();
        }
        return -1;
    }

    /**
     * 执行增删改语句 但是 有? 需要拼接字符串
     * @param sql
     * @param params
     * @return 受影响的行数
     * @throws Exception
     */
    public int executeUpdate(String sql,Object... params) throws Exception{
        //数组中的插入排序
        initConnection();
        pst=connection.prepareStatement(sql);
        if(params.length !=0){
            //参数加入
            for (int i = 0; i < params.length; i++) {
                pst.setObject(i+1, params[i]);
            }
        }
        try {
            int result = pst.executeUpdate();
            return result;
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            close();
        }
        return -1;
    }

    /**
     * 执行的查询语句 不带? 不需要拼接的
     * @param sql
     * @return ResultSet  自行去next()读取
     * @throws Exception
     */
    public ResultSet executeQuery(String sql) throws Exception{
        //数组中的插入排序
        initStatement();
        try {
            return statement.executeQuery(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 执行带?的查询语句 需要拼接的sql
     * @param sql
     * @param params
     * @return 结果集 自行next()读取
     * @throws Exception
     */
    public ResultSet executeQuery(String sql,Object... params) throws Exception{
        //数组中的插入排序
        connection = initConnection();
        pst=connection.prepareStatement(sql);
        if(params.length !=0){
            //参数加入
            for (int i = 0; i < params.length; i++) {
                pst.setObject(i+1, params[i]);
            }
            resultSet=pst.executeQuery();
            return  resultSet;
        }
        return  resultSet;
    }

    public List<Object> executeQueryList(String sql, Object... params) throws Exception{
        List<Object> objList=new ArrayList<>();
          //数组中的插入排序
        try {
            connection = initConnection();
            pst=connection.prepareStatement(sql);
            if(params.length !=0){
                //参数加入
                for (int i = 0; i < params.length; i++) {
                    pst.setObject(i+1, params[i]);
                }
                resultSet=pst.executeQuery();
                //填充对象到集合中
                //fillList(objList,resultSet);
            }
        }catch(SQLException e){
            e.printStackTrace();
        }finally {
            close();
        }

        return  objList;
    }

    /**
     * JSP DAO 模式的时候再放出来使用
     */
    //protected abstract void fillList(List<Object> objList, ResultSet resultSet);


}
